# https://docs.python-requests.org/zh_CN/latest/user/advanced.html#request-and-response-objects
import requests
from requests import cookies
# 会话对象
# 会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie， 期间使用 urllib3 的 connection pooling 功能。所以如果你向同一主机发送多个请求，底层的 TCP 连接将会被重用，从而带来显著的性能提升。
# 会话对象具有主要的 Requests API 的所有方法。
# 我们来跨请求保持一些 cookie:
s = requests.Session()
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get("http://httpbin.org/cookies")
print(r.text)
# 会话也可用来为请求方法提供缺省数据。这是通过为会话对象的属性提供数据来实现的：
s =requests.Session()
s.auth=('user','pass')
s.headers.update({'x-test':'true'})
r = s.get('http://httpbin.org/headers',headers={'x-test2':'true'})
print(r.text)
# 任何你传递给请求方法的字典都会与已设置会话层数据合并。方法层的参数覆盖会话的参数。

# 不过需要注意，就算使用了会话，方法级别的参数也不会被跨请求保持。下面的例子只会和第一个请求发送 cookie ，而非第二个：
s = requests.Session()
r = s.get('http://httpbin.org/cookies',cookies={'from-my':'browser'})
print(r.text)
r = s.get('http://httpbin.org/cookies')
print(r.text)
# 如果你要手动为会话添加 cookie，就使用 Cookie utility 函数 来操纵 Session.cookies。
# 会话还可以用作前后文管理器：
# with requests.Session() as s:
#     s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
# 这样就能确保 with 区块退出后会话能被关闭，即使发生了异常也一样。
# 从字典参数中移除一个值
# 有时你会想省略字典参数中一些会话层的键。要做到这一点，你只需简单地在方法层参数中将那个键的值设置为 None ，那个键就会被自动省略掉。

# 请求与响应对象
r = requests.get('http://en.wikipedia.org/wiki/Monty_Python')
# 如果想访问服务器返回给我们的响应头部信息，可以这样做：
print(r.headers)
# 如果想得到发送到服务器的请求的头部，我们可以简单地访问该请求，然后是该请求的头部：
print(r.request.headers)

# 准备的请求 （Prepared Request）
# 当你从 API 或者会话调用中收到一个 Response 对象时，request 属性其实是使用了 PreparedRequest。有时在发送请求之前，你需要对 body 或者 header （或者别的什么东西）做一些额外处理，下面演示了一个简单的做法：


